home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / tool6v12 / tool6v12.doc < prev    next >
Text File  |  1994-07-01  |  70KB  |  1,707 lines

  1. ┌──────────────────────────────────────────────────────────────────────────────┐
  2. │ ░░░░░░░░░░░░░ The "Complete" Borland Turbo Pascal 6.0 Toolbox ░░░░░░░░░░░░░░ │
  3. ├┬┬┬┬┬┬──────────────────────────────────────────────────────────────────┬┬┬┬┬┬┤
  4. ├┼┼┼┼┼┘                                                                  └┼┼┼┼┼┤
  5. ├┼┼┼┼┘                            Version 1.2                             └┼┼┼┼┤
  6. ├┼┼┼┘                                                                      └┼┼┼┤
  7. ├┼┼┘     Written by Thayne Breetzke   Copyright (c) 1994, Sphinx Software   └┼┼┤
  8. ├┼┘                                                                          └┼┤
  9. └┴────────────────────────────────────────────────────────────────────────────┴┘
  10.  
  11.  
  12.                                     Contents
  13. - ---──────────────────────────────────────────────────────────────────────--- -
  14.  
  15.     INTRODUCTION
  16.         Introduction and legal stuff
  17.         How to use the Toolbox
  18.         Contacting the author
  19.  
  20.     CURSOR ROUTINES
  21.         CursorOff
  22.         CursorOn
  23.         SaveCursorPos
  24.         RestoreCursorPos
  25.  
  26.     SCREEN ROUTINES
  27.         CalcAttr
  28.         VideoMem
  29.         DisplayType
  30.         DisplayTypeDesc
  31.         VideoMode
  32.         VideoModeDesc
  33.         RowsOnScreen
  34.         ColsOnScreen
  35.         SaveArea
  36.         RestoreArea
  37.         ChangeAttr
  38.         ClearArea
  39.         WriteMem
  40.         WriteXY
  41.         SetVideoMode
  42.         ScrollUp
  43.         ScrollDown
  44.         ScrollRight
  45.         ScrollLeft
  46.         ScreenOn
  47.         ScreenOff
  48.         SetBorder
  49.  
  50.     INPUT ROUTINES
  51.         WaitForKeypress
  52.         GetKey
  53.         ReadString
  54.  
  55.     MOUSE ROUTINES
  56.         MouseLocate
  57.         SetHercGraph
  58.         MInstalled
  59.         MReset
  60.         MButtons
  61.         SetMouseLimit
  62.         SetMousePos
  63.         ShowMouse
  64.         HideMouse
  65.         ReadMouseMotion
  66.         ResetMouseMovement
  67.         ReadMouseMovement
  68.         MouseXCor
  69.         MouseYCor
  70.         ButtonPressed
  71.         AnyButtonPressed
  72.         GetPressInfo
  73.         GetReleaseInfo
  74.         SetSensitivity
  75.         GetSensitivity
  76.         SetGraphicsCursor
  77.         SoftwareTextCursor
  78.         HardwareTextCursor
  79.         MArea
  80.  
  81.     STRING MANIPULATION ROUTINES
  82.         Spaces
  83.         Center
  84.         CopyChar
  85.         StrToNum
  86.         NumToStr
  87.         LeftTrim
  88.         RightTrim
  89.         Upper
  90.         Lower
  91.         BoolToStr
  92.  
  93.     DATE/TIME ROUTINES
  94.         CountryCode
  95.         CountryDateFormat
  96.         CountryCurrency
  97.         CountryThouSep
  98.         CountryDecSep
  99.         CountryDateSep
  100.         CountryTimeSep
  101.         CountryCurrFormat
  102.         CountryTimeFormat
  103.         LeapYear
  104.         DaysinMonth
  105.         DayOfWeek
  106.         DayOfWeekDesc
  107.         DayofYear
  108.         MonthDesc
  109.         DateStr
  110.         ValidDate
  111.         TimeStr
  112.         SecondsToTime
  113.  
  114.     WINDOW ROUTINES
  115.         WriteWinXY
  116.         WriteWinChar
  117.         OpenWindow
  118.         CloseWindow
  119.         DrawBox
  120.  
  121.     VGA ROUTINES
  122.         FadeOut
  123.         FadeIn
  124.         GetPalette
  125.         SetPalette
  126.         WaitForRetrace
  127.  
  128.     BIOS ROUTINES
  129.         WarmBoot
  130.         ColdBoot
  131.         SetTypematicRate
  132.         ResetTypematicRate
  133.         RShiftPressed
  134.         LShiftPressed
  135.         CtrlPressed
  136.         AltPressed
  137.         ScrollLockOn
  138.         NumLockOn
  139.         CapsLockOn
  140.         InsertOn
  141.         LCtrlPressed
  142.         LAltPressed
  143.         RCtrlPressed
  144.         RAltPressed
  145.         SysPressed
  146.         SuspendToggled
  147.         ScrollLockPressed
  148.         NumLockPressed
  149.         CapsPressed
  150.         InsertPressed
  151.         SetScrollLockOn
  152.         SetNumLockOn
  153.         SetCapsLockOn
  154.         SetInsertOn
  155.         SetScrollLockOff
  156.         SetNumLockOff
  157.         SetCapsLockOff
  158.         SetInsertOff
  159.         NumHardDisks
  160.         NumFloppies
  161.         ActiveFloppy
  162.         PrinterStatus
  163.         PrinterTimeOut
  164.         PrinterIOError
  165.         PrinterSelected
  166.         PrinterOutOfPaper
  167.         PrinterAcknowledge
  168.         PrinterNotBusy
  169.         MathCoPresent
  170.         DMAInstalled
  171.         NumSerialPorts
  172.         GameAdapterPresent
  173.         NumPrinterPorts
  174.  
  175.     MICELLANEOUS ROUTINES
  176.         CommandLine
  177.         KeyBoardOff
  178.         KeyBoardOn
  179.         ClearKeyBuffer
  180.         CPUType
  181.         GetCPUSpeed
  182.         SetPauseOff
  183.         SetPauseOn
  184.         SetPrtScrOff
  185.         SetPrtScrOn
  186.  
  187.     EDITOR ROUTINES
  188.         InitBuffer
  189.         FreeBuffer
  190.         ClearBuffer
  191.         EditText
  192.         LoadBuffer
  193.         SaveBuffer
  194.  
  195.     FILE ROUTINES
  196.         Exists
  197.  
  198.     LZH ROUTINES
  199.         InitLZHBuffers
  200.         FreeLZHBuffers
  201.         Encode
  202.         Decode
  203.  
  204.  
  205.                                   Introduction
  206. - ---──────────────────────────────────────────────────────────────────────--- -
  207.  
  208. This toolbox was created to provide a wide variety of Turbo Pascal routines
  209. for the Turbo Pascal programmer.  Using them will eliminate all the messy bits
  210. of code from your programs allowing you to focus on the programs' requirements.
  211. The routines are very useful and easy to use and include mouse routines, string
  212. manipulation routines, input routines, window routines, BIOS routines and more.
  213.  
  214. If you feel you would like a routine added, or have found any bugs (doubtful!),
  215. or have any comments, feel free to mail me at the address below.
  216.  
  217.  
  218. ■ This software is free (yes, believe it or not!). You may distribute it freely
  219.   as long as you don't charge a fee for it.  The units provided are for
  220.   evaluation purposes only.  A garbled archive is included containing the
  221.   registered versions of the units.  If you wish to continue using these units
  222.   please mail me at the address below stating your name and e-mail address and
  223.   I will send you a registration number which is to be entered as the password
  224.   when extracting the garbled archive.  If you do not have an e-mail address you
  225.   must send your postal address.  If you will be sending this information via
  226.   the postal service please include a self-addressed stamped envelope to allow
  227.   me to send you the registration number.
  228.  
  229.   Thereafter, the software is yours.  It's that simple. I would appreciate it if
  230.   you included my name in your programs that use these units.
  231.  
  232.   This response will enable me to determine how popular the toolbox is.  The
  233.   more response I receive the more encouraged I will be to continue to expand
  234.   and update it.
  235.  
  236. ■ The author and any distributor of this software assumes no responsibility
  237.   for damages resulting from this software or its use due to errors, omissions,
  238.   incompatibility with other software or hardware, or misuse; and specifically
  239.   disclaim any implied warranty of fitness for any particular purpose or
  240.   application.  Every care has been taken, however, to ensure that the routines
  241.   behave as stated.
  242.  
  243. ■ Turbo Pascal is a registered trademark of Borland International, Inc.
  244.  
  245.  
  246. USING THE TOOLBOX
  247.  
  248. To use the units in your own Turbo Pascal programs, simply include the name of
  249. the required unit in the "uses" statement of your program.  A detailed
  250. explanation of each unit and its routines follows.
  251.  
  252.  
  253.                              CONTACTING THE AUTHOR
  254.  
  255.         The author can be contacted at the following addresses:
  256.  
  257.         ■ E-mail: 9216189@ml.petech.ac.za
  258.  
  259.         ■ Normal mail: Thayne Breetzke
  260.                        7 Nahoon Valley Place
  261.                        Nahoon Valley
  262.                        East London
  263.                        5241
  264.                        South Africa
  265.  
  266.           (Any donations may be sent to the above address - thanks...)
  267.  
  268.         Note: You are REQUIRED to mail me to receive your registration
  269.               number for the garbled archive if you intend using this
  270.               software. (Hey, it's the least you could do!)
  271.  
  272.         I welcome any comments or suggestions.  Your support and
  273.         response will encourage me to continue to support this software.
  274.  
  275.  
  276.                                 CURSOR ROUTINES
  277. - ---──────────────────────────────────────────────────────────────────────--- -
  278.  
  279. UNIT NAME: Cursor.tpu
  280.  
  281.  
  282. PUBLIC DEFINITIONS
  283.  
  284. Type
  285.   CStateRec = Record
  286.                 InsertKey,
  287.                 CursorState: Boolean;
  288.                 InsertType,
  289.                 XCor,
  290.                 YCor       : Byte;
  291.               end;
  292. {      This is the record used for storing the cursor state.                   }
  293.  
  294. Var
  295.   CursorState : Boolean;
  296. {      Holds a TRUE value if the cursor is on; a FALSE value if it is off.
  297.        Used for reference only ie DO NOT ALTER THIS VALUE.  Defaults to TRUE.  }
  298.  
  299.   InsertType  : Byte;
  300. {      A user-definable variable used for setting the cursor type.  The effect
  301.        noticeable in insert mode only.  1 = Full-block cursor (default),
  302.        2 = Half-block cursor and 3 = Underscore cursor.                        }
  303.  
  304. Procedure CursorOff;
  305. {      Turns the cursor off                                                    }
  306.  
  307. Procedure CursorOn(InsertKey: Boolean);
  308. {      Turns the cursor on.  Set InsertKey to TRUE to set it to insert mode,
  309.        or FALSE to set it to normal mode.                                      }
  310.  
  311. Procedure SaveCursor(InsertKey: Boolean; Var CState: CStateRec);
  312. {      Saves the cursor position, state and insert type.  Set InsertKey to TRUE
  313.        if the cursor is in insert mode, else set it to FALSE. Useful for saving
  314.        the cursor position when opening a full-screen window at the start
  315.        of a program in order to restore the original DOS screen upon exiting.
  316.        Use RestoreCursorPos to restore the cursor (see below).  A variable of
  317.        type CStateRec must be passed to hold the cursor state.                 }
  318.  
  319. Procedure RestoreCursor(CState: CStateRec);
  320. {      Used to restore the cursor position, state and insert type after being
  321.        saved using SaveCursorPos (see above) using the cursor state record
  322.        provided.                                                               }
  323.  
  324.  
  325. COMMENTS
  326.  
  327. These routines take the current video mode into consideration (eg hercules or
  328. vga).
  329.  
  330.  
  331.                                 SCREEN ROUTINES
  332. - ---──────────────────────────────────────────────────────────────────────--- -
  333.  
  334. UNIT NAME: Screen.tpu
  335.  
  336.  
  337. PUBLIC DEFINITIONS
  338.  
  339. Function  CalcAttr(FGround, BGround: Byte): Byte;
  340. {      Calculates a colour using the FGround and BGround.
  341.  
  342.        ie Colour = FGround + (BGround * 16)                                    }
  343.  
  344. Function  VideoMem: Word;
  345. {      Returns the base address of video memory ie $B000 for monochrome card
  346.        and $B800 for graphics card.                                            }
  347.  
  348. Function  DisplayType: Byte;
  349. {      Returns the type of display being used.  Possible values are as follows:
  350.        DispType = $00  No display
  351.                   $01  MDA with monochrome display
  352.                   $02  CGA with colour display
  353.                   $03  Reserved
  354.                   $04  EGA with colour display
  355.                   $05  EGA with monochrome display
  356.                   $06  Professional graphics controller
  357.                   $07  VGA with analog monochrome display
  358.                   $08  VGA with analog colour display
  359.                   $09  Reserved
  360.                   $0A  MCGA with digital colour display
  361.                   $0B  MCGA with analog monochrome display
  362.                   $0C  MCGA with analog colour display
  363.                   $FF  Unrecognized video system                               }
  364.  
  365. Function  DisplayTypeDesc(DispType: Byte): String;
  366. {      Returns a description of the type of display being used.  See above for
  367.        the possible descriptions.                                              }
  368.  
  369. Function  VideoMode: Byte;
  370. {      Returns the current video mode.  Possible values are as follows:
  371.        VidMode = $00  40x25 B/W text (CGA,EGA,MCGA,VGA)
  372.                = $01  40x25 16 color text (CGA,EGA,MCGA,VGA)
  373.                = $02  80x25 16 shades of gray text (CGA,EGA,MCGA,VGA)
  374.                = $03  80x25 16 color text (CGA,EGA,MCGA,VGA)
  375.                = $04  320x200 4 color graphics (CGA,EGA,MCGA,VGA)
  376.                = $05  320x200 4 color graphics (CGA,EGA,MCGA,VGA)
  377.                = $06  640x200 B/W graphics (CGA,EGA,MCGA,VGA)
  378.                = $07  80x25 Monochrome text (MDA,HERC,EGA,VGA)
  379.                = $08  160x200 16 color graphics (PCjr)
  380.                = $09  320x200 16 color graphics (PCjr)
  381.                = $0A  640x200 4 color graphics (PCjr)
  382.                = $0B  Reserved (EGA BIOS function 11)
  383.                = $0C  Reserved (EGA BIOS function 11)
  384.                = $0D  320x200 16 color graphics (EGA,VGA)
  385.                = $0E  640x200 16 color graphics (EGA,VGA)
  386.                = $0F  640x350 Monochrome graphics (EGA,VGA)
  387.                = $10  640x350 16 color graphics (EGA or VGA with 128K)
  388.                       640x350 4 color graphics (64K EGA)
  389.                = $11  640x480 B/W graphics (MCGA,VGA)
  390.                = $12  640x480 16 color graphics (VGA)
  391.                = $13  320x200 256 color graphics (MCGA,VGA)
  392.                = $8x  EGA, MCGA or VGA ignore bit 7
  393.                = $9x  EGA, MCGA or VGA ignore bit 7                            }
  394.  
  395. Function  VideoModeDesc(VidMode: Byte): String;
  396. {      Returns a description of the current video mode.  See above for the
  397.        possible descriptions.                                                  }
  398.  
  399. Function  RowsOnScreen: Byte;
  400. {      Returns the number of rows on the screen.                               }
  401.  
  402. Function  ColsOnScreen: Word;
  403. {      Returns the number of columns on the screen.                            }
  404.  
  405. Procedure SaveArea(X1,Y1,X2,Y2: Byte; Var ScrBuffer: ScrBufferRec);
  406. {      Saves the specified area of a text screen.  ScrBuffer is a variable
  407.        declared as ScrBufferRec (defined in this unit).  You must use
  408.        RestoreArea before re-saving an area in the same variable to deallocate
  409.        memory.  See below for a description of RestoreArea.                    }
  410.  
  411. Procedure RestoreArea(Var ScrBuffer: ScrBufferRec);
  412. {      Restores the area previously saved in the specified variable using
  413.        SaveArea.                                                               }
  414.  
  415. Procedure SaveLine(YCor: Byte; Var TheString: String);
  416. {      Saves the specified line of a text screen into TheString.  If you save
  417.        a line without restoring it, the previously saved data will be
  418.        overwritten with the new data.                                          }
  419.  
  420. Procedure RestoreLine(YCor: Byte; Var TheString: String);
  421.  
  422. {      Restores the previously saved line to the specified line of a text
  423.        screen, using the data in TheString.                                    }
  424.  
  425. Procedure ChangeAttr(X1,Y1,X2,Y2,Colour: Word);
  426. {      Changes the attributes of the specified area of a text screen to the
  427.        specified attribute (Colour).                                           }
  428.  
  429. Procedure ClearArea(X1,Y1,X2,Y2,Colour: Byte; TheChar: Char);
  430. {      Clears the specified area of a text screen, changing the attribute of
  431.        the area to the specified attribute (Colour) and fills the area with the
  432.        specified filler character (TheChar).                                   }
  433.  
  434. Procedure WriteMem(X,Y: Byte; TheText: String);
  435. {      Writes TheText directly to screen memory at position (X,Y).  This is a
  436.        fast write routine.  The attributes on the screen are not changed in any
  437.        way.                                                                    }
  438.  
  439. Procedure WriteXY(X,Y: Byte; TheText: String; Colour: Byte);
  440. {      Writes TheText to a text screen at position (X,Y) using the specified
  441.        attribute (Colour).                                                     }
  442.  
  443. Procedure SetVideoMode(VidMode: Byte);
  444. {      Sets the video mode to the specified mode.  Refer to the function
  445.        VideoMode above for a complete list of possible values for VidMode.     }
  446.  
  447. Procedure ScrollUp(X1,Y1,X2,Y2,NumLines,Colour: Byte);
  448. {      Scrolls the specified area of a text screen up NumLines lines using
  449.        the specified attribute (Colour) for the new bottom line.                   }
  450.  
  451. Procedure ScrollDown(X1,Y1,X2,Y2,NumLines,Colour: Byte);
  452. {      Scrolls the specified area of a text screen down NumLines lines
  453.        using the specified attribute (Colour) for the new top line.            }
  454.  
  455. Procedure ScrollRight(X1,Y1,X2,Y2,NumLines,Colour: Byte);
  456. {      Scrolls the specified area of a text screen right NumLines lines
  457.        using the specified attribute (Colour) for the new line.                }
  458.  
  459. Procedure Scrolleft(X1,Y1,X2,Y2,NumLines,Colour: Byte);
  460. {      Scrolls the specified area of a text screen left NumLines lines
  461.        using the specified attribute (Colour) for the new line.                }
  462.  
  463. Procedure ScreenOn;
  464.  
  465. {      Sets the screen on after being turned off using ScreenOff.              }
  466.  
  467. Procedure ScreenOff;
  468.  
  469. {      Sets the screen off.  Use ScreenOn to turn it back on.  This is very
  470.        useful when drawing a screen, especially when the process is slow.  Once
  471.        it is drawn the screen can turned to show the results instantly.        }
  472.  
  473. Procedure SetBorder(Colour: Byte);
  474.  
  475. {      Sets the border colour to the specified colour.                         }
  476.  
  477.  
  478. COMMENTS
  479.  
  480. To compute the Colour attribute use CalcAttr or perform the following:
  481.  
  482.   Colour = Foreground + Background * 16
  483.  
  484.  
  485.                                  INPUT ROUTINES
  486. - ---──────────────────────────────────────────────────────────────────────--- -
  487.  
  488. UNIT NAME: Input.tpu
  489.  
  490.  
  491. PUBLIC DEFINITIONS
  492.  
  493. Type
  494.   CharSet = Set of Char;
  495.  
  496. Var
  497.   InsertKey: Boolean;
  498. {      Holds a TRUE value if insert mode is active else a FALSE value if it
  499.        is not.                                                                 }
  500.  
  501. Procedure WaitForKeypress;
  502. {      Waits for a keypress.  The keyboard buffer is flushed after a key is
  503.        pressed.                                                                }
  504.  
  505. Procedure GetKey(Var Key: Char; Var Extended: Boolean;
  506.                  NormalKeys: CharSet; ExtendedKeys: CharSet;
  507.                  DoWait: Boolean; DoUpdate: Boolean; UpdateProc: Routine;
  508.                  UpdateVar: Word);
  509. {      This routine's basic function is to get a keypress from the user.  There
  510.        are a wide variety of parameters which make it a powerful routine.  They
  511.        are as follows:
  512.  
  513.        Key:          Returns the key the user pressed (if one was pressed)
  514.        Extended:     Returns TRUE if the key pressed was an extended key else
  515.                      FALSE if it was not.
  516.        NormalKeys:   This is a set of legal normal keys the user may press.
  517.                      eg 'A',ENTER,SPACE.
  518.        ExtendedKeys: This is a set of legal extended keys the user may press.
  519.                      eg F1,ALT-X,ALT-P.
  520.        DoWait:       If TRUE is specified then the routine will wait for a
  521.                      keypress else it will not.
  522.        DoUpDate:     If TRUE is specified then the routine will execute the
  523.                      update procedure specified as the last parameter of this
  524.                      routine else it will not.
  525.        UpdateProc:   This is the update routine that will be executed while
  526.                      the routine waits for a keypress, provided that DoUpDate
  527.                      was set to TRUE.  This is a powerful feature added
  528.                      recently to allow, for example, a clock to be displayed,
  529.                      or to trap additional keys like F1 or ALT-X and execute
  530.                      a procedure for each.  Refer to the comments below with
  531.                      regard to using this procedure.
  532.        UpdateVar:    This variable is passed to the above UpdateProc.          }
  533.  
  534.  
  535. Procedure ReadString(Var InputString: String; X, Y, StringLength, BoxSize: Byte;
  536.                      LegalChars: CharSet; UpperOnly: Boolean;
  537.                      NormalEndChars: CharSet; ExtEndChars: CharSet;
  538.                      Var TerminateChar: Char; Var Extended: Boolean;
  539.                      DoUpdate, AtTheEnd: Boolean; Colour: Byte;
  540.                      UpdateProc: Routine; UpdateVar: Word);
  541. {      This routine accepts input from the user.  The various parameters are
  542.        explained below:
  543.  
  544.        InputString:    This string hold the text to be edited or entered.  Note
  545.                        that if it contains a value, that value will be displayed
  546.                        allowing the user to edited it.  Therefore, assign this
  547.                        field a '' value to allow the user to type a new value.
  548.        X:              Specifies the X-position of the entry area.
  549.        Y:              Specifies the Y-position of the entry area.
  550.        StringLength:   Specifies the maximum number of characters the user is
  551.                        allowed to enter.
  552.        BoxSize:        Specifies the size of the entry area in characters plus
  553.                        2.  The BoxSize, for example, may be 24 while the
  554.                        StringLength may be 200 allowing the user to enter 200
  555.                        character within an area of 24 characters.
  556.        LegalChars:     This is a set containing the legal characters the user may
  557.                        enter.
  558.        UpperOnly:      If TRUE is specified then all characters entered will be
  559.                        changed to uppercase.
  560.        NormalEndChars: This is a set of legal normal keys the user may press to
  561.                        end the input eg ENTER,CTRL-ENTER.
  562.        ExtEndChars:    This is a set of legal extended keys the user may press
  563.                        to terminate the input eg ALT-X,ALT-P.
  564.        TerminateChar:  Returns the key the user pressed to terminate the input.
  565.        Extended:       Returns TRUE if the terminate key was an extended key
  566.                        else FALSE if it was not.
  567.        DoUpDate:       If TRUE is specified then the routine will execute the
  568.                        update procedure specified as the last parameter of this
  569.                        routine else it will not.
  570.        AtTheEnd:       If TRUE is specified the cursor will be positioned to
  571.                        end of the string value to be edited else it will be
  572.                        placed at the beginning.
  573.        Colour:         Specifies the attribute to use for the data entry area.
  574.        UpdateProc:     This is the update routine that will be executed while
  575.                        the routine waits for a keypress, provided that DoUpDate
  576.                        was set to TRUE.  This is a powerful feature added
  577.                        recently to allow, for example, a clock to be displayed,
  578.                        or to trap additional keys like F1 or ALT-X and execute
  579.                        a procedure for each.  Refer to the comments below with
  580.                        regard to using this procedure.
  581.        UpdateVar:      This variable is passed to the above UpdateProc.
  582.  
  583.        The following keys may be used during data input:
  584.  
  585.        Left-arrow:  Moves the cursor one position to the left.
  586.        Right-arrow: Moves the cursor one position to the right.
  587.        Home:        Moves the cursor to the beginning of the entry area.
  588.                     Repetitive presses will move it left BoxSize minus 2
  589.                     characters.
  590.        End:         Moves the cursor to the end of the entry area.  Repetitive
  591.                     presses will move it right BoxSize minus 2 characters.
  592.        Ctrl-Home:   Moves the cursor to the beginning of the input string.
  593.        Ctrl-End:    Moves the cursor to the end of the input string.
  594.        Backspace:   Deletes the character to the left of the cursor.
  595.        Delete:      Deletes the character beneath the cursor.
  596.        Insert:      Toggles insert mode.
  597.        Ctrl-Y:      Deletes the input string.
  598.        Ctrl-Left:   Moves the cursor one word to the left.
  599.        Ctrl-Right:  Moves the cursor one word to the right.                    }
  600.  
  601.  
  602. COMMENTS
  603.  
  604. The UpdateProc must be defined in your program as follows:
  605.  
  606.   {$F+}
  607.   Procedure UpdateProc(Var Key: Char; Var Extended: Boolean; UpdateVar: Word);
  608.  
  609.   Begin
  610.     { any other code is inserted here }
  611.   end;
  612.   {$F-}
  613.  
  614.   Note that you may change the values that Key and Extended hold from within
  615.   UpdateProc if need be.
  616.  
  617.   An example of a ReadString would be:
  618.  
  619.   ReadString(InputString,5,5,200,24,[#0..#255],True,[#13,#10,#27,#45],[],
  620.              Key,Extended,True,False,112,UpdateProc,0);
  621.  
  622.   A demonstration will more easily show what it does and how UpdateProc is
  623.   used.  Refer to the demo files included.
  624.  
  625.  
  626.                                  MOUSE ROUTINES
  627. - ---──────────────────────────────────────────────────────────────────────--- -
  628.  
  629. UNIT NAME: Mouse.tpu
  630.  
  631.  
  632. PUBLIC DEFINITIONS
  633.  
  634. Type
  635.   Array32Word = Array[0..31] of Word;
  636. {      Type for defining a graphics mouse cursor.                              }
  637.  
  638. Const
  639.   Hand : Array32word = ($ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  640.                         $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  641.                         $0000,$0000,$0700,$0500,$0500,$05FC,$0554,$0D54,
  642.                         $1554,$1004,$0804,$0404,$0208,$0208,$0208,$0208);
  643. {      A pre-defined graphics mouse cursor.                                    }
  644.  
  645.                             INITIALIZING THE MOUSE
  646.  
  647. To be able to use the mouse, it must first be initialized.
  648.  
  649. Function MInstalled: Boolean;
  650. {      The above function initializes the mouse and its software and returns
  651.        TRUE if a mouse is installed.
  652.  
  653.        In addition the following is performed:
  654.  
  655.        The mouse is positioned in the center of the screen.
  656.        The mouse cursor is reset and hidden.
  657.        The double speed threshold is set to 64 mickeys per second.
  658.        The horizontal mickey to pixel ratio is set (8 to 8).
  659.        The vertical mickey to pixel ratio is set (16 to 8).
  660.        The maximum width and height are set to maximum for the video mode.
  661.  
  662.        Note: When using a graphics mode, first initialize the graphics mode
  663.              followed by the mouse.                                            }
  664.  
  665. Function MReset: Boolean;
  666. {      This function resets the mouse software, but not the mouse itself. It
  667.        returns TRUE if a mouse is installed.                                   }
  668.  
  669. Function MButtons: Byte;
  670. {      This function returns the number of buttons on the mouse (if
  671.        installed).                                                             }
  672.  
  673. Procedure SetMouseLimit(X1, X2, Y1, Y2: Integer);
  674. {      This procedure sets the minimum and maximum horizontal and vertical
  675.        bounds. This enables you to limit the cursor movement to a certain
  676.        area.                                                                   }
  677.  
  678. Procedure SetMousePos(X, Y: Integer);
  679. {      Use this procedure to position the mouse cursor at the coordinates
  680.        (X,Y).                                                                  }
  681.  
  682. Procedure ShowMouse;
  683. {      This procedure shows the mouse cursor.                                  }
  684.  
  685.  
  686.                          OTHER FUNCTIONS AND PROCEDURES
  687.  
  688. Function MouseXCor: Integer;
  689. {      This function returns the current x-coordinate of the mouse cursor.     }
  690.  
  691. Function MouseYCor: Integer;
  692. {      This function returns the current y-coordinate of the mouse cursor.     }
  693.  
  694. Procedure ReadMouseMotion(Var Horiz, Vert: Integer);
  695. {      This procedure returns the mouse motion counters.  Horiz holds the
  696.        horizontal mickey count and Vert holds the vertical mickey count.  Count
  697.        values are 1/200 inch intervals.
  698.  
  699. Procedure ResetMouseMovement;
  700. {      This procedure must be called before the following procedure is called.
  701.        It must be called before each loop that uses ReadMouseMovement, as it
  702.        initializes variables used by the ReadMouseMovement procedure.  See the
  703.        demonstration program included.                                         }
  704.  
  705. Procedure ReadMouseMovement(Var Horiz, Vert: Integer);
  706. {      This procedure returns the number of columns the mouse has been moved
  707.        horizontally (Horiz), and the number of rows the mouse has been moved
  708.        vertically (Vert).  An upward direction returns a negative value in
  709.        Vert, a downward direction returns a positive value in Vert, a left
  710.        direction returns a negative value in Horiz, and a right direction
  711.        returns a positive value in Horiz.  ResetMouseMovement must be
  712.        called before this procedure is used (see above).  See the demonstration
  713.        program included.                                                       }
  714.  
  715. Procedure HideMouse;
  716. {      This procedure hides the mouse cursor.                                  }
  717.  
  718. Function ButtonPressed: Byte;
  719. {      This function returns the last button pressed.                          }
  720.  
  721. Function AnyButtonPressed: Boolean;
  722. {      This function returns TRUE if a mouse button has been pressed.          }
  723.  
  724. Procedure GetPressInfo(Button: Byte; Var Presses, XCord, YCord: Integer);
  725. {      This procedure returns data relating to button presses of the mouse.
  726.        The parameters are as follows:
  727.  
  728.        Button:  0 for left button
  729.                 1 for right button
  730.        Presses: Count of button presses (set to zero after call).
  731.        XCord:   Horizontal position of mouse cursor at last press.
  732.        YCord:   Vertical position of mouse cursor at last press.               }
  733.  
  734. Procedure GetReleaseInfo(Button: Byte; Var Releases, XCord, YCord: Integer);
  735. {      This procedure returns data relating to button releases of the mouse.
  736.        The parameters are as follows:
  737.  
  738.        Button:   0 for left button
  739.                  1 for right button
  740.        Releases: Count of button releases (set to zero after call).
  741.        XCord:    Horizontal position of mouse cursor at last release.
  742.        YCord:    Vertical position of mouse cursor at last release.            }
  743.  
  744. Function MArea(X1, X2, Y1, Y2: Integer): Boolean;
  745. {      This function returns TRUE if the mouse cursor is currently within the
  746.        specified area.                                                         }
  747.  
  748. Procedure GetSensitivity(Var HPixel, VPixel, Speed: Word);
  749. {      This procedure returns the mouse sensitivity information as the number
  750.        of mouse coordinates per screen pixel.  The parameters are as follows:
  751.  
  752.        HPixel: Horizontal coordinates per pixel.
  753.        VPixel: Vertical coordinates per pixel.
  754.        Speed:  Double speed threshold.                                         }
  755.  
  756. Procedure SetSensitivity(HPixel, VPixel, Speed: Word);
  757. {      This procedure sets the mouse sensitivity information as the number of
  758.        mouse coordinates per screen pixel.  The parameters are as follows:
  759.  
  760.        HPixel: Horizontal coordinates per pixel (the default is 8).
  761.        VPixel: Vertical coordinates per pixel (the default is 16).
  762.        Speed:  Double speed threshold (the default is 64).                     }
  763.  
  764. Function MouseLocate(User-defined constant): Word;
  765. {      This function uses a table of coordinates and returns a value indicating
  766.        which, if any, set of coordinates the mouse cursor is within.
  767.  
  768.        The user-defined constant should be defined as follows:
  769.  
  770.        Const
  771.          CorTable: Array[1..NumEntries,1..4] of Word =
  772.                    ((NumEntries,0,0,0),
  773.                     (X1,X2,Y1,Y1)...);
  774.  
  775.        For example: There are two options which the user may select by clicking
  776.                     a mouse button.  The horizontal position of the first ranges
  777.                     from 352 to 504 and its vertical position is 80.  The
  778.                     horizontal position of the second option ranges from 352 to
  779.                     488 and its vertical position is 96.  The user-defined
  780.                     constant should be defined as follows:
  781.  
  782.                     Const
  783.                       CorTable: Array[1..3,1..4] of Word =
  784.                                 ((3,0,0,0),
  785.                                  (352,504,80,80),
  786.                                  (352,488,96,96));
  787.  
  788.  
  789.        The function is called as follows:
  790.  
  791.        Index := MouseLocate(CorTable);
  792.  
  793.  
  794.        Note: The maximum number of entries allowed in the table is 100.        }
  795.  
  796.  
  797. Procedure SetHercGraph;
  798. {      Calling this procedure before the mouse is initialized ensures that the
  799.        mouse display routines operate correctly in hercules graphics mode.     }
  800.  
  801. Procedure SetGraphicsCursor(HHotSpot,VHotSpot: Byte; MCursor: WordType);
  802. {      This procedure selects a pre-defined graphics cursor.  The parameters
  803.        are as follows:
  804.  
  805.        HHotSpot: Horizontal hotspot.
  806.        VHotSpot: Vertical hotspot.
  807.        MCursor:  Graphics cursor.
  808.  
  809.        The unit has one pre-defined graphics cursor available.  It is defined
  810.        as follows:
  811.  
  812.        Const
  813.          Hand: Array32Word = ($ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  814.                               $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  815.                               $0000,$0000,$0700,$0500,$0500,$05FC,$0554,$0D54,
  816.                               $1554,$1004,$0804,$0404,$0208,$0208,$0208,$0208);}
  817.  
  818. Procedure SoftwareTextCursor(ScreenMask,CursorMask: Word);
  819. {      This procedure sets the software text cursor.                           }
  820.  
  821. Procedure HardwareTextCursor(FromScanLine,ToScanLine: Byte);
  822. {      This procedure sets the hardware text cursor.
  823.  
  824.        FromScanLine: Start of hardware scan line.
  825.        ToScanLine:   End of hardware scan line.                                }
  826.  
  827.  
  828. COMMENTS
  829.  
  830. A powerful mouse cursor designer is included with the registered version of
  831. the toolbox.  It was written using this mouse unit.
  832.  
  833.  
  834.                           STRING MANIPULATION ROUTINES
  835. - ---──────────────────────────────────────────────────────────────────────--- -
  836.  
  837. UNIT NAME: Strings.tpu
  838.  
  839.  
  840. PUBLIC DEFINITIONS
  841.  
  842. Var
  843.   StringError: Integer;
  844. {      Holds an error code if a string error occurred.                         }
  845.  
  846. Function Spaces(NumSpaces: Integer): String;
  847. {      Returns a string containing the specified number of spaces.  NumSpaces
  848.        must not be greater than 80.  See CopyChar below.                       }
  849.  
  850. Function Center(TheString: String; MaxLength: Byte): String;
  851. {      Centers the contents specified in TheString within the specified width
  852.        and returns the centered string as the function's result.  If the
  853.        length of the string is greater than the specified width, StringError
  854.        will be set equivalent to: The strings length minus MaxLength.          }
  855.  
  856. Function CopyChar(TheChar: Char; NumChars: Integer): String;
  857. {      Replicates the specified character a specified number of times and
  858.        returns the resulting string as the result of the function.  NumChars
  859.        must be less than 256.                                                  }
  860.  
  861. Function StrToNum(TheString: String): LongInt;
  862. {      Converts a string to a LongInt.  If an error occurs StringError will be
  863.        set indicating the position at which it occurred.                       }
  864.  
  865. Function NumToStr(Num:Real; Width, Decimals: Byte;
  866.                   LeadingZeros: Boolean): String;
  867. {      Converts the specified number to a string with the specified number of
  868.        decimals within a specified width to allow for right justification.
  869.        Set LeadingZeros to TRUE to set the filler character to a zero, else
  870.        FALSE to set it to a space.                                             }
  871.  
  872. Function LeftTrim(TheString: String): String;
  873. {      Trims all the spaces off the leftmost end of the specified string.      }
  874.  
  875. Function RightTrim(TheString: String): String;
  876. {      Trims all the spaces off the rightmost end of the specified string.     }
  877.  
  878. Function Upper(TheString: String): String;
  879. {      Converts the specified string to an upper case string.                  }
  880.  
  881. Function Lower(TheString: String): String;
  882. {      Converts the specified string to a lower case string.                   }
  883.  
  884. Function BoolToStr(TheBool: Boolean; Defaults: String): String;
  885. {      Converts a boolean value to a string.  Defaults specifies the true/
  886.        false values the resulting string should inherit in that order.  These
  887.        true/false values MUST be separated by a forward slash (/).  The
  888.        following is an example of a possible default specification: 'Yes/No'.  }
  889.  
  890.  
  891. COMMENTS
  892.  
  893. None.
  894.  
  895.  
  896.                                DATE/TIME ROUTINES
  897. - ---──────────────────────────────────────────────────────────────────────--- -
  898.  
  899. UNIT NAME: DateTime.tpu
  900.  
  901.  
  902. PUBLIC DEFINITIONS
  903.  
  904. Type
  905.   Str4 = String[4];
  906.   Str2 = String[2];
  907.  
  908. Function CountryCode: Word;
  909. {      Returns the country code from the country settings.  The following are
  910.        the available country codes:
  911.  
  912.          1: United States
  913.          2: French Canada
  914.          3: Latin America
  915.         31: Netherlands
  916.         32: Belgium
  917.         33: France
  918.         34: Spain
  919.         36: Hungary
  920.         38: Yugoslavia
  921.         39: Italy
  922.         41: Switzerland
  923.         42: Czechoslovakia
  924.         44: United Kingdom
  925.         45: Denmark
  926.         46: Sweden
  927.         47: Norway
  928.         48: Poland
  929.         49: Germany
  930.         55: Brazil
  931.         61: International English
  932.         81: Japan
  933.         82: Korea
  934.         86: China
  935.         90: Turkey
  936.        351: Portugal
  937.        354: Iceland
  938.        358: Finland
  939.        785: Saudi Arabia
  940.        972: Israel                                                             }
  941.  
  942. Function CountryDateFormat: Word;
  943. {      Returns the country date format from the country settings.              }
  944.  
  945. Function CountryCurrency: Str4;
  946. {      Returns the country currency from the country settings.                 }
  947.  
  948. Function CountryThouSep: Char;
  949. {      Returns the country thousand separator from the country settings.       }
  950.  
  951. Function CountryDecSep: Char;
  952. {      Returns the country decimal separator from the country settings.        }
  953.  
  954. Function CountryDateSep: Char;
  955. {      Returns the country date separator from the country settings.           }
  956.  
  957. Function CountryTimeSep: Char;
  958. {      Returns the country time separator from the country settings.           }
  959.  
  960. Function CountryCurrFormat: Byte;
  961. {      Returns the country currency format from the country settings.          }
  962.  
  963. Function CountryTimeFormat: Byte;
  964. {      Returns the country time format from the country settings.              }
  965.  
  966. Function LeapYear(Year:Word): Boolean;
  967. {      Returns a TRUE value if the year specified is a leap year, else FALSE.  }
  968.  
  969. Function DaysInMonth(Month: Byte; Year: Word): Byte;
  970. {      Returns the number of days in the specified month.                      }
  971.  
  972. Function DayOfWeek(Day,Month: Byte; Year: Integer): Byte;
  973. {      Returns the day of week for the day, month and year combination
  974.        specified.                                                              }
  975.  
  976. Function DayOfWeekDesc(Day: Byte): String;
  977. {      Returns the description for the specified day of the week.              }
  978.  
  979. Function DayOfYear(Day,Month: Byte; Year: Word): Word;
  980. {      Returns the day of the year for the day, month and year combination
  981.        specified.  Valid for all years from 1901 to 2078.                      }
  982.  
  983. Function MonthDesc(Month: Byte): String;
  984. {      Returns the description for the specified month of the year.            }
  985.  
  986. Function DateStr(Day,Month: Byte; Year: Word; Format: Byte; DateSep: Char): String;
  987. {      Formats the specified date according to the format specified using the
  988.        specified date separator.  The formats supported are:
  989.  
  990.        0:  mm/dd/yy
  991.        1:  dd/mm/yy
  992.        2:  dd/mm/yyyy
  993.        3:  mm/dd/yyyy
  994.        4:  [d]d xxx yyyy   (xxx is alpha month of 3 Chars)
  995.        5:  xxx [d]d, yyyy
  996.        6:  [d]d FullAlphaMth yyyy
  997.        7:  FullAlphaMth [d]d, yyyy
  998.        8:  [d]d-xxx-yy
  999.        9:  xxx [d]d, 'yy                                                       }
  1000.  
  1001. Function ValidDate(Day,Month: Byte; Year: Word; Var ErrorCode: Byte): Boolean;
  1002. {      Returns a TRUE value if the date specified is a valid one.  If it is
  1003.        invalid, a relevant error code will be returned in ErrorCode as follows:
  1004.  
  1005.        Year out of range (< 1901 or > 2078) bit 0 of errorcode is set.
  1006.        Month < 1 or > 12                    bit 1 of errorcode is set.
  1007.        Day < 1 or > 31                      bit 2 of errorcode is set.
  1008.        Day out of range For month           bit 2 of errorcode is set.         }
  1009.  
  1010. Function TimeStr(Hour,Min,Sec,Format:Byte; TimeSep: Char): String;
  1011. {      Formats the specified time according to the format specified using the
  1012.        specified time separator.  The formats supported are:
  1013.  
  1014.        0:  hh:mm xx   (xx is am or pm)
  1015.        1:  hh:mm
  1016.        2:  [h]h hours, [m]m minutes, [s]s seconds
  1017.        3:  [h]h hrs [m]m min [s]s sec
  1018.        4:  TotalSeconds
  1019.        5:  hh:mm:ss
  1020.        6:  [h]h:mm xx                                                          }
  1021.  
  1022. Function SecondsToTime(Seconds: LongInt; Format: Byte; TimeSep: Char): String;
  1023. {      Converts the specified number of seconds to a time using the specified
  1024.        format and time separator.  Refer to the procedure above, TimeStr, to
  1025.        see the formats supported.                                              }
  1026.  
  1027.  
  1028. COMMENTS
  1029.  
  1030. NOTE: Each value for Year MUST be a full value ie four digits eg 1994 not 94.
  1031.  
  1032.  
  1033.                                 WINDOW ROUTINES
  1034. - ---──────────────────────────────────────────────────────────────────────--- -
  1035.  
  1036. UNIT NAME: Win.tpu
  1037.  
  1038.  
  1039. PUBLIC DEFINITIONS
  1040.  
  1041. Type
  1042.   TitleStr = String[80];
  1043.   FrameChars = Array[1..8] of Char;
  1044.   WinState = Record
  1045.     WindMin, WindMax: Word;
  1046.     XCor,
  1047.     YCor,
  1048.     Attr:    Byte;
  1049.   end;
  1050.   TitleStrPtr = ^TitleStr;
  1051.   WinRecPtr = ^WinRec;
  1052.   WinRec = Record
  1053.              Next      : WinRecPtr;
  1054.              State     : WinState;
  1055.              Title,
  1056.              Message   : TitleStrPtr;
  1057.              TitleAttr,
  1058.              FrameAttr : Byte;
  1059.              WinBuffer : Pointer;
  1060.            end;
  1061.  
  1062. Const
  1063.   SingleFrame: FrameChars = '┌─┐││└─┘';
  1064.   DoubleFrame: FrameChars = '╔═╗║║╚═╝';
  1065.   NoFrame    : FrameChars = '        ';
  1066.  
  1067. Var
  1068.   Ch          : Char;
  1069.   TopWindow   : WinRecPtr;
  1070.   WindowCount : Word;
  1071. {      The number of windows currently open                                    }
  1072.  
  1073. procedure WriteWinXY(X, Y: Byte; S: String; Attr: Byte);
  1074. {      Writes the specified string at the specified position relative to the
  1075.        window using the specified atttribute.                                  }
  1076.  
  1077. procedure WriteWinChar(X, Y, Count: Byte; Ch: Char; Attr: Byte);
  1078. {      Copies the specified character Count times at the specified position
  1079.        relative to the window using the specified attribute.                   }
  1080.  
  1081. Procedure OpenWindow(X1,Y1,X2,Y2: Byte; T: TitleStr; M: TitleStr;
  1082.                      DFrame: FrameChars; TAttr, FAttr: Byte; Border: Boolean);
  1083. {      Opens a window at the specified position (X1,Y1),(X2,Y2).  Specify the
  1084.        title of the window in parameter T and the message (to be displayed at
  1085.        the bottom of the window) in parameter M.  Specify the type of frame
  1086.        in the DFrame parameter (SingleFrame, DoubleFrame, NoFrame).  Specify
  1087.        the text attribute in TAttr and the frame attribute in FAttr.  Set
  1088.        Border to TRUE if you require a shadow, else set to FALSE.              }
  1089.  
  1090. Procedure CloseWindow;
  1091. {      Closes the last window opened.                                          }
  1092.  
  1093. Procedure DrawBox(X1,Y1,X2,Y2: Byte; T: TitleStr; M: TitleStr;
  1094.                   DFrame: FrameChars; TAttr, FAttr: Byte; Border: Boolean);
  1095. {      The parameter are the same as for opening a window, see description for
  1096.        OpenWindow.                                                             }
  1097.  
  1098.  
  1099. COMMENTS
  1100.  
  1101. None.
  1102.  
  1103.                                   VGA ROUTINES
  1104. - ---──────────────────────────────────────────────────────────────────────--- -
  1105.  
  1106. UNIT NAME: Vga256.tpu
  1107.  
  1108.  
  1109. PUBLIC DEFINITIONS
  1110.  
  1111. Type
  1112.   TRGB = record
  1113.     Red, Green, Blue: Byte;
  1114.   end;
  1115.   PaletteType = Array[0..255] of TRGB;
  1116. {      Define all palette variables using this type                            }
  1117.  
  1118. Procedure FadeOut(Red, Green, Blue, Steps : Byte);
  1119. {      Fades the palette to the specified colours in a specified number of
  1120.        steps.  The smaller Steps is the faster the fade.                       }
  1121.  
  1122. Procedure FadeIn(Var Pal: PaletteType; Steps: Byte);
  1123. {      Fades the palette to the specified palette in a specified number of
  1124.        steps.  The smaller Steps is the faster the fade.                       }
  1125.  
  1126. Procedure GetPalette(Var Palette: PaletteType);
  1127. {      Stores the current 256 colour VGA palette in the specified variable.                   }
  1128.  
  1129. Procedure SetPalette(Var Palette: PaletteType);
  1130. {      Sets the 256 colour VGA palette to the specified palette bypassing BIOS.
  1131.        BIOS.                                                                   }
  1132.  
  1133. Procedure WaitForRetrace;
  1134. {      Waits for a vertical retrace to complete.  Useful for reducing flicker. }
  1135.  
  1136.  
  1137. COMMENTS
  1138.  
  1139. These routines can be used for both text and graphics modes.
  1140.  
  1141.  
  1142.                                  BIOS ROUTINES
  1143. - ---──────────────────────────────────────────────────────────────────────--- -
  1144.  
  1145. UNIT NAME: Bios.tpu
  1146.  
  1147.  
  1148. PUBLIC DEFINITIONS
  1149.  
  1150. Var
  1151.   KeyFlag1  : Byte
  1152. {      Keyboard flag byte 1
  1153.  
  1154.             │7│6│5│4│3│2│1│0│
  1155.                  │ │ │ │ │ │ │ └─── right shift key depressed
  1156.                  │ │ │ │ │ │ └──── left shift key depressed
  1157.                  │ │ │ │ │ └───── CTRL key depressed
  1158.                  │ │ │ │ └────── ALT key depressed
  1159.                  │ │ │ └─────── scroll-lock is active
  1160.                  │ │ └──────── num-lock is active
  1161.                  │ └───────── caps-lock is active
  1162.              └────────── insert is active                                      }
  1163.  
  1164.   KeyFlag2  : Byte
  1165. {      Keyboard flag byte 2
  1166.  
  1167.             │7│6│5│4│3│2│1│0│
  1168.                  │ │ │ │ │ │ │ └─── left CTRL key depressed
  1169.                  │ │ │ │ │ │ └──── left ALT key depressed
  1170.                  │ │ │ │ │ └───── system key depressed and held
  1171.                  │ │ │ │ └────── suspend key has been toggled
  1172.                  │ │ │ └─────── scroll lock key is depressed
  1173.                  │ │ └──────── num-lock key is depressed
  1174.                  │ └───────── caps-lock key is depressed
  1175.              └────────── insert key is depressed                               }
  1176.  
  1177.   KeyFlag3  : Byte
  1178. {      Keyboard flag byte 3
  1179.  
  1180.             │7│6│5│4│3│2│1│0│ Keyboard mode/type
  1181.                  │ │ │ │ │ │ │ └─── last code was the E1 hidden code
  1182.                  │ │ │ │ │ │ └──── last code was the E0 hidden code
  1183.                  │ │ │ │ │ └───── right CTRL key depressed
  1184.                  │ │ │ │ └────── right ALT key depressed
  1185.                  │ │ │ └─────── 101/102 enhanced keyboard installed
  1186.                  │ │ └──────── force num-lock if Rd ID & KBX
  1187.                  │ └───────── last char was first ID char
  1188.              └────────── read ID in process                                    }
  1189.  
  1190.   EquipFlag1: Byte
  1191. {      Equipment list flag 1
  1192.  
  1193.             │7│6│5│4│3│2│1│0│
  1194.                  │ │ │ │ │ │ │ └─ IPL diskette installed
  1195.                  │ │ │ │ │ │ └── math coprocessor
  1196.                  │ │ │ │ ├─┼─── old PC system board RAM < 256K
  1197.                  │ │ │ │ │ └── pointing device installed (PS/2)
  1198.                  │ │ │ │ └─── not used on PS/2
  1199.                  │ │ └─┴──── initial video mode
  1200.              └─┴─────── # of diskette drives, less 1                           }
  1201.  
  1202.   EquipFlag2: Byte
  1203. {      Equipment list flag 2
  1204.  
  1205.             │7│6│5│4│3│2│1│0│
  1206.                  │ │ │ │ │ │ │ └─ 0 if DMA installed
  1207.                  │ │ │ │ └─┴─┴── number of serial ports
  1208.                  │ │ │ └─────── game adapter
  1209.                  │ │ └──────── not used, internal modem (PS/2)
  1210.              └─┴───────── number of printer ports                              }
  1211.  
  1212. Procedure WarmBoot;
  1213. {      Warm boots the machine.                                                 }
  1214.  
  1215. Procedure ColdBoot;
  1216. {      Issues a disk reset (DOS function 0D) and cold boots the machine.  Use
  1217.        with caution.  It is the programmer's responsiblility to ensure that
  1218.        cache buffers are flushed.                                              }
  1219.  
  1220. Procedure SetTypematicRate(TypeRate,TypeDelay: Byte);
  1221. {      Used on AT machines with extended keyboard support.
  1222.  
  1223.        TypeDelay may be one of the following:
  1224.  
  1225.              0 = 250ms     2 = 750ms
  1226.              1 = 500ms     3 = 1000ms
  1227.  
  1228.        TypeRate may be one of the following:
  1229.  
  1230.              00 - 30.0      01 - 26.7      02 - 24.0      03 - 21.8
  1231.              04 - 20.0      05 - 18.5      06 - 17.1      07 - 16.0
  1232.              08 - 15.0      09 - 13.3      0A - 12.0      0B - 10.9
  1233.              0C - 10.0      0D - 9.2       0E - 8.6       0F - 8.0
  1234.              10 - 7.5       11 - 6.7       12 - 6.0       13 - 5.5
  1235.              14 - 5.0       15 - 4.6       16 - 4.3       17 - 4.0
  1236.              18 - 3.7       19 - 3.3       1A - 3.0       1B - 2.7
  1237.              1C - 2.5       1D - 2.3       1E - 2.1       1F - 2.0             }
  1238.  
  1239. Procedure ResetTypematicRate;
  1240. {      Sets typematic rate to default.                                         }
  1241.  
  1242. Function  RShiftPressed: Boolean;
  1243. {      Returns TRUE if the right shift key is pressed, else FALSE.               }
  1244.  
  1245. Function  LShiftPressed: Boolean;
  1246. {      Returns TRUE if the left shift key is depressed, else FALSE.            }
  1247.  
  1248. Function  CtrlPressed: Boolean;
  1249. {      Returns TRUE if CTRL is depressed, else FALSE.                          }
  1250.  
  1251. Function  AltPressed: Boolean;
  1252. {      Returns TRUE if ALT is depressed, else FALSE.                           }
  1253.  
  1254. Function  ScrollLockOn: Boolean;
  1255. {      Returns TRUE if scroll lock mode is on, else FALSE.                     }
  1256.  
  1257. Function  NumLockOn: Boolean;
  1258. {      Returns TRUE if number lock is on, else FALSE.                          }
  1259.  
  1260. Function  CapsLockOn: Boolean;
  1261. {      Returns TRUE if caps lock is on, else FALSE.                            }
  1262.  
  1263. Function  InsertOn: Boolean;
  1264. {      Returns TRUE if insert mode is on, else FALSE.                          }
  1265.  
  1266. Function  LCtrlPressed: Boolean;
  1267. {      Returns TRUE if the left CTRL key is depressed, else FALSE.             }
  1268.  
  1269. Function  LAltPressed: Boolean;
  1270. {      Returns TRUE if the left ALT key is depressed, else FALSE.              }
  1271.  
  1272. Function  RCtrlPressed: Boolean;
  1273. {      Returns TRUE if the right CTRL key is depressed, else FALSE.            }
  1274.  
  1275. Function  RAltPressed: Boolean;
  1276. {      Returns TRUE if the right ALT key is depressed, else FALSE.             }
  1277.  
  1278. Function  SysPressed: Boolean;
  1279. {      Returns TRUE if the systems request key is depressed, else FALSE.       }
  1280.  
  1281. Function  SuspendToggled: Boolean;
  1282. {      Returns TRUE if suspend is toggled, else FALSE.                         }
  1283.  
  1284. Function  ScrollLockPressed: Boolean;
  1285. {      Returns TRUE if the scroll lock key is depressed, else FALSE.           }
  1286.  
  1287. Function  NumLockPressed: Boolean;
  1288. {      Returns TRUE if the number lock key is depressed, else FALSE.           }
  1289.  
  1290. Function  CapsPressed: Boolean;
  1291. {      Returns TRUE if the caps lock key is depressed, else FALSE.             }
  1292.  
  1293. Function  InsertPressed: Boolean;
  1294. {      Returns TRUE if the insert key is depressed, else FALSE.                }
  1295.  
  1296. Procedure SetScrollLockOn;
  1297. {      Sets scroll lock mode on.                                               }
  1298.  
  1299. Procedure SetNumLockOn;
  1300. {      Sets number lock on.                                                    }
  1301.  
  1302. Procedure SetCapsLockOn;
  1303. {      Sets caps lock on.                                                      }
  1304.  
  1305. Procedure SetInsertOn;
  1306. {      Sets insert mode on.                                                    }
  1307.  
  1308. Procedure SetScrollLockOff;
  1309. {      Sets scroll lock mode off.                                              }
  1310.  
  1311. Procedure SetNumLockOff;
  1312. {      Sets number lock mode off.                                              }
  1313.  
  1314. Procedure SetCapsLockOff;
  1315. {      Sets caps lock off.                                                     }
  1316.  
  1317. Procedure SetInsertOff;
  1318. {      Sets insert mode off.                                                   }
  1319.  
  1320. Function  NumHardDisks: Byte;
  1321. {      Returns the number of hard disks present.                               }
  1322.  
  1323. Function  NumFloppies: Byte;
  1324. {      Returns the number of floppy drives present.                            }
  1325.  
  1326. Function  ActiveFloppy: Byte;
  1327. {      Returns the active floppy.  Useful for detecting if there is a phantom
  1328.        drive present.  0 = A: and 1 = B:                                       }
  1329.  
  1330. Function  PrinterStatus(Port: Word): Byte;
  1331. {      Returns the current printer status byte.  Note that not all printers
  1332.        return reliable status information; bit 3 and bit 7 are usually
  1333.        reliable.
  1334.  
  1335.              │7│6│5│4│3│2│1│0│
  1336.              │ │ │ │ │ │ │ └────  time-out
  1337.              │ │ │ │ │ └─┴─────  unused
  1338.              │ │ │ │ └────────  1 = I/O error  (parallel pin 15)
  1339.              │ │ │ └─────────  1 = printer selected/on-line  (parallel pin 13)
  1340.              │ │ └──────────  1 = out of paper  (parallel pin 12)
  1341.              │ └───────────  1 = printer acknowledgment  (parallel pin 10)
  1342.              └────────────  1 = printer not busy  (parallel pin 11)            }
  1343.  
  1344. Function  PrinterTimeOut(Port: Word): Boolean;
  1345. {      Returns TRUE if printer has timed out, else FALSE.                      }
  1346.  
  1347. Function  PrinterIOError(Port: Word): Boolean;
  1348. {      Returns TRUE if a printer I/O error has occurred, else FALSE.          }
  1349.  
  1350. Function  PrinterSelected(Port: Word): Boolean;
  1351. {      Returns TRUE if the printer is selected, else FALSE.                   }
  1352.  
  1353. Function  PrinterOutOfPaper(Port: Word): Boolean;
  1354. {      Returns TRUE if the printer is out of paper, else FALSE.               }
  1355.  
  1356. Function  PrinterAcknowledge(Port: Word): Boolean;
  1357. {      Returns TRUE if the printer is acknowledged, else FALSE.               }
  1358.  
  1359. Function  PrinterNotBusy(Port: Word): Boolean;
  1360. {      Returns TRUE if the printer is not busy, else FALSE.                   }
  1361.  
  1362. Function  MathCoPresent: Boolean;
  1363. {      Returns TRUE if a math co-processor is present, else FALSE.            }
  1364.  
  1365. Function  DMAInstalled: Boolean;
  1366. {      Returns TRUE if DMA is installed, else FALSE.                          }
  1367.  
  1368. Function  NumSerialPorts: Byte;
  1369. {      Returns the number of serial ports.                                    }
  1370.  
  1371. Function  GameAdapterPresent: Boolean;
  1372. {      Returns TRUE is a game adapter is present, else FALSE.                 }
  1373.  
  1374. Function  NumPrinterPorts: Byte;
  1375. {      Returns the number of printer ports.                                   }
  1376.  
  1377.  
  1378. COMMENTS
  1379.  
  1380. None.
  1381.  
  1382.  
  1383.                              MISCELLANEOUS ROUTINES
  1384. - ---──────────────────────────────────────────────────────────────────────--- -
  1385.  
  1386. UNIT NAME: Misc.tpu
  1387.  
  1388.  
  1389. PUBLIC DEFINITIONS
  1390.  
  1391. Function  CommandLine: String;
  1392. {      Returns the command line following the program name.                    }
  1393.  
  1394. Procedure KeyBoardOff;
  1395. {      Turns the keyboard off.                                                 }
  1396.  
  1397. Procedure KeyBoardOn;
  1398. {      Turns the keyboard on.                                                  }
  1399.  
  1400. Procedure ClearKeyBuffer;
  1401. {      Clears the keyboard buffer.                                             }
  1402.  
  1403. Function CPUType: Byte;
  1404. {      Returns the CPU type for the current machine.  CPUType will be one of
  1405.        the following:
  1406.  
  1407.        1 = 8086
  1408.        2 = 80286
  1409.        3 = 80386
  1410.        4 = 80486                                                               }
  1411.  
  1412. Procedure GetCPUSpeed(Var Mhz, KHz: Word);
  1413. {      Returns an estimate of the CPU speed of the current machine into the
  1414.        specified variables.                                                    }
  1415.  
  1416. Procedure SetPauseOff;
  1417. {      Latches onto the timer interrupt ($08) to enable pause presses to be
  1418.        ignored.                                                                }
  1419.  
  1420. Procedure SetPauseOn;
  1421. {      Restores the timer interrupt ($08).  Used after previously setting
  1422.        pause off using SetPauseOff.                                            }
  1423.  
  1424. Procedure SetPrtScrOff;
  1425. {      Latches onto the print-screen interrupt ($05) to enable print screen
  1426.        presses to be ignored.                                                  }
  1427.  
  1428. Procedure SetPrtScrOn;
  1429. {      Restores the print-screen interrupt ($05).  Used after previously
  1430.        setting print screen off using SetPrtScrOff.                            }
  1431.  
  1432.  
  1433. COMMENTS
  1434.  
  1435. None.
  1436.  
  1437.  
  1438.                                 EDITOR ROUTINES
  1439. - ---──────────────────────────────────────────────────────────────────────--- -
  1440.  
  1441. UNIT NAME: Editor.tpu
  1442.  
  1443.  
  1444. PUBLIC DEFINITIONS
  1445.  
  1446. Type
  1447.   BuffType = Array[1..1] of Char;
  1448.   BuffPtr = ^BuffType;
  1449.   BufferRec = Record
  1450.                 Buff       : BuffPtr; { The buffer                         }
  1451.                 BuffSize,             { Set when the buffer is initialized }
  1452.                 TextSize   : Word;    { The size of the text in the buffer }
  1453.                 ChangesMade: Boolean; { Holds a TRUE value if the text has }
  1454.                                       { changed else FALSE if it has not.  }
  1455.               end;
  1456.   BufferPtr = ^BufferRec;
  1457.   PosType = (AtStart,AtEnd,AsIs);
  1458.  
  1459.  
  1460. Var
  1461.   Buffer: BufferPtr;
  1462.  
  1463. Procedure InitBuffer(Var Buffer: BufferPtr; Size: Word);
  1464. {      Allocates the specified amount of bytes of buffer memory to the
  1465.        specified buffer, initializes its variables and sets ChangesMade to
  1466.        FALSE.  This procedure MUST be called before the editor is called.      }
  1467.  
  1468. Procedure FreeBuffer(Var Buffer: BufferPtr);
  1469. {      Deallocates the memory allocated to the specified buffer.               }
  1470.  
  1471. Procedure ClearBuffer(Var Buffer: BufferPtr);
  1472. {      Empties the buffer and resets it's variables.  It does not affect then
  1473.        ChangesMade variable.                                                   }
  1474.  
  1475. Procedure EditText(Var Buffer: BufferPtr; X1,Y1,BoxLength,
  1476.                    BoxDepth: Byte; LegalChars: CharSet; UpperOnly: Boolean;
  1477.                    NormalEndChars: CharSet; ExtEndChars: CharSet;
  1478.                    Var TerminateChar: Char; Var Extended: Boolean;
  1479.                    DoUpdate: Boolean; Position: PosType; Initialize: Boolean;
  1480.                    UpdateProc: Routine);
  1481. {      Calls the editor and edits the text in the specified buffer.  The various
  1482.        parameters are explained below:
  1483.  
  1484.        Buffer:         The buffer containing the text to be edited.
  1485.        X1:             The X-position of the top-left corner of the edit window.
  1486.        Y1:             The Y-position of the top-left corner of the edit window.
  1487.        BoxLength:      The length of the edit window.
  1488.        BoxDepth:       The depth of the edit window.
  1489.        LegalChars:     This is a set containing the legal characters the user
  1490.                        may enter.
  1491.        UpperOnly:      If TRUE is specified then all characters entered will be
  1492.                        changed to uppercase.
  1493.        NormalEndChars: This is a set of legal normal keys the user may press to
  1494.                        terminate the editing eg ENTER,CTRL-ENTER.
  1495.        ExtEndChars:    This is a set of legal extended keys the user may press
  1496.                        to terminate the editing eg ALT-X,ALT-P.
  1497.        TerminateChar:  Returns the key the user pressed to terminate the
  1498.                        editing.
  1499.        Extended:       Returns TRUE if the terminate key was an extended key
  1500.                        else FALSE if it was not.
  1501.        DoUpDate:       If TRUE is specified then the routine will execute the
  1502.                        update procedure specified as the last parameter of this
  1503.                        routine else it will not.
  1504.        Position:       Position can be one of three values: AtStart, AtEnd or
  1505.                        AsIs.  AtStart causes the beginning of the text to be
  1506.                        displayed initially, AtEnd causes the end of the text to
  1507.                        be displayed initially and AsIs causes the text to be
  1508.                        displayed as it was last.
  1509.        Initialize:     If TRUE is specified then the ClearBuffer procedure will
  1510.                        be called automaticaly before editing commences.
  1511.        UpDateProc:     This is the update routine that will be executed while
  1512.                        the routine waits for a keypress, provided that DoUpDate
  1513.                        was set to TRUE.  This is a powerful feature added
  1514.                        recently to allow, for example, a clock to be displayed,
  1515.                        or to trap additional keys like F1 or ALT-X and execute
  1516.                        a procedure for each.  Refer to the comments for the
  1517.                        'Input Routines' section.
  1518.  
  1519.        The following keys may be used during data input:
  1520.  
  1521.        Up-Arrow:    Moves the cursor one line up.
  1522.        Down-Arrow:  Moves the cursor one line down.
  1523.        Left-Arrow:  Moves the cursor one position to the left.
  1524.        Right-Arrow: Moves the cursor one position to the right.
  1525.        Home:        Moves the cursor to the beginning of the line.
  1526.        End:         Moves the cursor to the end of the line.
  1527.        Page-Up:     Moves the cursor one page up.
  1528.        Page-Down:   Moves the cursor one page down.
  1529.        Ctrl-Home:   Moves the cursor to the beginning of the text.
  1530.        Ctrl-End:    Moves the cursor to the end of the text.
  1531.        Ctrl-Left:   Moves the cursor to the beginning of the previous word.
  1532.        Ctrl-Right:  Moves the cursor to the beginning of the next word.
  1533.        Tab:         Tabs the cursor to the right (does not insert a TAB
  1534.                     character).
  1535.        Shift-Tab:   Tabs the cursor to the left (does not insert a TAB
  1536.                     character).
  1537.  
  1538.        Insert:      Toggles insert mode.
  1539.        Backspace:   Deletes the character to the left of the cursor.
  1540.        Delete:      Deletes the character beneath the cursor.
  1541.        Ctrl-Y:      Deletes the current line.
  1542.        Ctrl-E:      Deletes from the current line to the end of the text.
  1543.        Ctrl-C:      Centers the current line.
  1544.        Enter:       Moves the cursor to the next line (insert mode off).
  1545.        Enter:       Inserts a line (insert mode on).
  1546.  
  1547. The ChangesMade variable for the specified buffer is set to TRUE if any changes
  1548. are made to the text.  This variable can be changed by the programmer as can
  1549. Buff and TextSize.  Do NOT alter BuffSize as it is for reference only.  You
  1550. may alter the buffer contents as long as TextSize is altered accordingly and
  1551. that it is done before or after EditText is called - not from within it.       }
  1552.  
  1553. Procedure LoadBuffer(Var Buffer: BufferPtr; FileName: String;
  1554.                      Var ErrorCode: Integer);
  1555. {      Loads the specified file into the buffer and returns IOResult to the
  1556.        ErrorCode variable.  This procedure checks for all I/O errors and
  1557.        returns the result and therefore won't crash at any point.  If the file
  1558.        is too large to fit into the buffer, it will load as much as it can and
  1559.        return an ErrorCode of 255 (file to large, only partially read).        }
  1560.  
  1561. Procedure SaveBuffer(Var Buffer: BufferPtr; FileName: String;
  1562.                      Var ErrorCode: Integer);
  1563. {      Saves the buffer to the specified file and returns IOResult to the
  1564.        ErrorCode variable.  This procedure checks for all I/O errors and
  1565.        returns the result and therefore won't crash at any point.              }
  1566.  
  1567.  
  1568. COMMENTS
  1569.  
  1570. The maximum buffer size which can be specified is 65,535.  I have not found a
  1571. need for a buffer size greater than this, but am considering increasing this
  1572. limit.
  1573.  
  1574.  
  1575.                                  FILE ROUTINES
  1576. - ---──────────────────────────────────────────────────────────────────────--- -
  1577.  
  1578. UNIT NAME: Files.tpu
  1579.  
  1580.  
  1581. PUBLIC DEFINITIONS
  1582.  
  1583. Function Exists(FileName: String): Boolean;
  1584. {      Returns TRUE if the specified file exists else returns FALSE.           }
  1585.  
  1586.  
  1587. COMMENTS
  1588.  
  1589. This unit is still under development.
  1590.  
  1591.  
  1592.                                   LZH ROUTINES
  1593. - ---──────────────────────────────────────────────────────────────────────--- -
  1594.  
  1595. UNIT NAME: Lzh.tpu
  1596.  
  1597.  
  1598. PUBLIC DEFINITIONS
  1599.  
  1600. Procedure InitLZHBuffers(BufferSize: Word);
  1601. {      Allocates the internal buffers to be used to compress and decompress
  1602.        data.  BufferSize specifies the size of the buffers to be used. This
  1603.        procedure MUST be called before the following are used.                 }
  1604.  
  1605. Procedure FreeLZHBuffers;
  1606. {      De-allocates the buffers allocated using the InitLZHBuffers procedure.  }
  1607.  
  1608. Procedure Encode(ReadRoutine: Routine; WriteRoutine: Routine;
  1609.                  Bytes: LongInt);
  1610. {      Encodes data using the program-defined read routine and write routine.
  1611.        Bytes specifies the number of Bytes to encode.  By allowing the
  1612.        programmer to specify the read and write routines provides much
  1613.        flexibility.  Disk files can the read, encoded, and written to disk;
  1614.        read, and encoded directly into a memory variable; read, decoded, and
  1615.        written to disk; read, and decoded directly into a memory variable. See
  1616.        the demonstration provided to see how these program-specified routines
  1617.        are used.                                                               }
  1618.  
  1619. Procedure Decode(ReadRoutine: Routine; WriteRoutine: Routine);
  1620. {      Behaves in the same way as Encode, except that the data is decoded.  The
  1621.        number of bytes to be decoded is not specified.  See the demonstration
  1622.        program provided to see how the program-specified routines are used.    }
  1623.  
  1624.  
  1625. COMMENTS
  1626.  
  1627. Refer to the demonstration program provided (DEMOLZH.EXE).
  1628.  
  1629.  
  1630.                                    REVISIONS
  1631. - ---──────────────────────────────────────────────────────────────────────--- -
  1632.  
  1633. Version 1.1                                                        20 April 1994
  1634.  
  1635.   ■ Fixed a bug in the Windows unit - WindowCount was not initially initialized
  1636.     to zero.
  1637.   ■ WriteXY no longer adjusts the current cursor position
  1638.   ■ Added two routines to the Screen unit: SaveLine and RestoreLine.
  1639.   ■ Modifed SaveArea and RestoreArea to allow the saving and restoring using
  1640.     program-defined variables.
  1641.   ■ Modified the OpenWindow and DrawBox routines so as to use the frame
  1642.     attribute for titles and messages.
  1643.   ■ Fixed minor memory de-allocation bug in the window routine.
  1644.   ■ Included a new unit allowing for LZH-type compression and decompression.
  1645.   ■ Modified GetKey and ReadKey to allow a value to be passed to UpdateProc.
  1646.   ■ Modified SaveCursorPos and RestoreCursorPos to allow for multiple saving
  1647.     of cursor states.
  1648.   ■ Modified the save and restore cursor routines to enable RestoreCursor to
  1649.     set the cursor on or off automatically.
  1650.  
  1651.  
  1652. Version 1.2                                                          1 July 1994
  1653.  
  1654.   ■ Modified the Windows unit - window titles are now placed on the window
  1655.     frame in the best possible position, regardless of the lengths of the titles
  1656.     or whether a shadow is used.
  1657.  
  1658.   ■ Added two very useful routines to the Mouse unit to allow for the reading of
  1659.     mouse movement.  These routines differ to that of the ReadMouseMotion
  1660.     routine.
  1661.  
  1662.   ■ My apologies to those who tried to re-compile the demonstration programs but
  1663.     couldn't.  I forgot to update one or two of them.  Each has been compiled
  1664.     using the modified units and each has been tested.
  1665.  
  1666.  
  1667.                                    THANKS TO
  1668. - ---──────────────────────────────────────────────────────────────────────--- -
  1669.  
  1670. ■ All those who have responded both positively (and negatively).
  1671. ■ Brad Meier for his suggestions given.
  1672. ■ Those who have registered their copies of the toolbox.
  1673.  
  1674.  
  1675.                                   NEW VERSIONS
  1676. - ---──────────────────────────────────────────────────────────────────────--- -
  1677.  
  1678. New versions of the toolbox can be found at the following sites:
  1679.  
  1680. ■ ftp.sun.ac.za  (not at present)
  1681. ■ ftp.uwp.edu  (not at present)
  1682. ■ ftp.wustl.edu  (/pub/MSDOS_UPLOADS/programming/pascal/TOOL6Vxx.ARJ)
  1683.  
  1684.  
  1685.                 LOOK OUT FOR OTHER SOFTWARE FROM THE SAME AUTHOR
  1686. - ---──────────────────────────────────────────────────────────────────────--- -
  1687.  
  1688.                  >>> The Turbo Pascal 6.0 Help File Creator <<<
  1689.  
  1690. Create on-line help for your Turbo Pascal programs in an extremely fast,
  1691. efficient and user-friendly manner and eliminate all the messy bits of code from
  1692. your programs when coding on-line help.  You are also able to to create on-line
  1693. manuals or anything of a similar nature.  In this case no Turbo Pascal knowledge
  1694. is necessary.
  1695.  
  1696. A demo version of HFC can be acquired from:
  1697.  
  1698.   ■ the following internet site:
  1699.  
  1700.     ftp.wustl.edu (/pub/MSDOS_UPLOADS/programming/pascal/HFC6Vxx.ARJ) using FTP
  1701.  
  1702.   ■ the following South African BBS (East London):
  1703.  
  1704.     A & M ONLINE (56654)
  1705.  
  1706. - ---──────────────────────────────────────────────────────────────────────--- -
  1707.